// 创建和初始化数组
let dayofweek = new Array();
dayofweek = new Array(7);

let dayofweek = [];
console.log(dayofweek.length);

// 访问元素和迭代数组
for(let i = 0; i < dayofweek.length; i++){
    console.log(dayofweek[i]);
}

// 添加元素
let numbers = [0,1,2,3,4,5,6,7,8,9]
// 尾部插入
numbers[numbers.length] = 10;
// 通过 push 方法能添加任意个元素
numbers.push(11);
numbers.push(12,13)

// 在数组开头插入元素
Array.prototype.inserFirstPosition = function(value){
    for(let i = this.length; i >= 0; i--){ 
        this[i] = this[i-1];
    }
    this[0] = value;
}
// 使用 unshift  直接插入数组开头
numbers.unshift(-1);
numbers.unshift(-2,-3);

// 删除元素
// 末尾处删除元素
numbers.pop();

// 删除处理 undefined 问题
Array.prototype.reIndex = function(myArray){ 
    const newArray = [];
    for(let i = 0; i < myArray.length; i++){ 
        if(myArray[i] != undefined){
            newArray.push(myArray[i]);
        }
    }
    return newArray;
}
// 手动移除第一个元素 并重新排序
Array.prototype.removeFirstPosition = function(){
    for(let i = 0; i < this.length; i++){
        this[i] = this[i + 1];
    }
    return this.reIndex(this);
}

// 通过 push pop 模拟栈  unshift shift 模拟队列

// 在任意位置添加或删除元素 

// 使用 splice方法
numbers.splice(5,3)   // 从索引5开始的3个元素删除
//插入 
numbers.splice(5,0,2,3,4)
// splice 方法接受的第一个参数，表示想要删除或插入的元素的索引值
// 第二个参数是删除元素的个数  0 不删除，就是插入元素的意思
// 第三个参数往后，就是要添加到数组里的值

// 打印二维数组,可以直接使用 console.table(table)

// 数组各种方法 push pop shift unshift splice
/**
 * concat   连接2个或更多数组，并返回结果
 * every    如果该函数对每个元素都返回true，则返回true
 *          every 方法会迭代数组中的每个元素，直到返回false
 * filter   返回该函数会返回true 的元素组成的数组
 * forEach  遍历，没有返回值
 * join     将所有的数组元素连接成一个字符串
 * indexOf  返回第一个与给定参数相等的数组元素的索引，没有找到则返回-1
 * lastIndexOf  返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
 * map      对数组中的每个元素运行给定函数，返回每次函数调用的结果组成的数组
 * reverse  颠倒数组
 * slice    传入索引值，将数组里对应索引范围内的元素作为新数组返回
 * some     对数组中的每个元素运行给定函数，如果任一元素返回true，则返回true
 *          迭代数组的每个元素，直到函数返回true。
 * sort     按照字母顺序对数组排序，支持传入指定排序方法的函数作为参数
 * toSting  将数组作为字符串返回
 * valueOf  和toString 类似，将数组作为字符串返回
 * reduce   接收一个有如下四个参数的函数：previousValue、currentValue、
 *          index 和array。
 */

// 迭代器函数
const isEven = x => x % 2 === 0;
numbers.every(isEven)
numbers.forEach(x => console.log(x % 2 === 0));
numbers.map(isEven);
numbers.filter(isEven);
// reduce 求和
numbers.reduce((pre,cur) => pre + cur);
// 使用 for ... of 循环迭代
for(let n of numbers){ 
    // do something
}

// entries,keys,values 方法

// from 方法  根据已有数组创建新数组
let numbers2 = Array.from(numbers);
// 根据传入的参数创建一个新数组
Array.of();   
// 使用展开运算符将数组里面的值都展开成参数
let numbersCopy = Array.of(...numbers2);

numbersCopy.fill(2,1)   // 数组中从1 开始的所有位置上的值都是 2 
let ones = Array(6).fill(1);

// sort() 在对数组做排序时，把元素默认成字符串进行相互比较
// 传入自己写的比较函数  需要自己自定义比较函数去进行排序比较
numbersCopy.sort((a, b) => a - b);

// indexOf  lastIndexOf
// find findIndex 方法接收一个回调函数

// includes 方法
numbers.includes(4,5);

// 输出数组为字符串
// toString join 
numbers.toString();
numbers.join('-');